using Mbl.ParameterizedTest.FluentCollectionBuilding.Expectors;

namespace Mbl.ParameterizedTest.FluentCollectionBuilding.RowCollectors
{
    /// <summary>
    /// Test row collector for string outputs with 1 input arguments
    /// </summary>
    public class StringTestRowCollector<TIn1> : TestRowCollector<TIn1, string>
    {        
        public StringTestRowCollector(TestCollection<TIn1, string> testCollection)
            : base(testCollection)
        {            
        }

        public StringExpector<TIn1, StringTestRowCollector<TIn1>> Given(TIn1 in1)
        {            
            return new StringExpector<TIn1, StringTestRowCollector<TIn1>>(this, CreateTestCase(in1));
        }        
    }    

    /// <summary>
    /// Test row collector for string outputs with 2 input arguments
    /// </summary>
    public class StringTestRowCollector<TIn1, TIn2> : TestRowCollector<TIn1, TIn2, string>
    {        
        public StringTestRowCollector(TestCollection<TIn1, TIn2, string> testCollection)
            : base(testCollection)
        {            
        }

        public StringExpector<TIn1, TIn2, StringTestRowCollector<TIn1, TIn2>> Given(TIn1 in1, TIn2 in2)
        {            
            return new StringExpector<TIn1, TIn2, StringTestRowCollector<TIn1, TIn2>>(this, CreateTestCase(in1, in2));
        }        
    }    

    /// <summary>
    /// Test row collector for string outputs with 3 input arguments
    /// </summary>
    public class StringTestRowCollector<TIn1, TIn2, TIn3> : TestRowCollector<TIn1, TIn2, TIn3, string>
    {        
        public StringTestRowCollector(TestCollection<TIn1, TIn2, TIn3, string> testCollection)
            : base(testCollection)
        {            
        }

        public StringExpector<TIn1, TIn2, TIn3, StringTestRowCollector<TIn1, TIn2, TIn3>> Given(TIn1 in1, TIn2 in2, TIn3 in3)
        {            
            return new StringExpector<TIn1, TIn2, TIn3, StringTestRowCollector<TIn1, TIn2, TIn3>>(this, CreateTestCase(in1, in2, in3));
        }        
    }    

    /// <summary>
    /// Test row collector for string outputs with 4 input arguments
    /// </summary>
    public class StringTestRowCollector<TIn1, TIn2, TIn3, TIn4> : TestRowCollector<TIn1, TIn2, TIn3, TIn4, string>
    {        
        public StringTestRowCollector(TestCollection<TIn1, TIn2, TIn3, TIn4, string> testCollection)
            : base(testCollection)
        {            
        }

        public StringExpector<TIn1, TIn2, TIn3, TIn4, StringTestRowCollector<TIn1, TIn2, TIn3, TIn4>> Given(TIn1 in1, TIn2 in2, TIn3 in3, TIn4 in4)
        {            
            return new StringExpector<TIn1, TIn2, TIn3, TIn4, StringTestRowCollector<TIn1, TIn2, TIn3, TIn4>>(this, CreateTestCase(in1, in2, in3, in4));
        }        
    }    

    /// <summary>
    /// Test row collector for string outputs with 5 input arguments
    /// </summary>
    public class StringTestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5> : TestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5, string>
    {        
        public StringTestRowCollector(TestCollection<TIn1, TIn2, TIn3, TIn4, TIn5, string> testCollection)
            : base(testCollection)
        {            
        }

        public StringExpector<TIn1, TIn2, TIn3, TIn4, TIn5, StringTestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5>> Given(TIn1 in1, TIn2 in2, TIn3 in3, TIn4 in4, TIn5 in5)
        {            
            return new StringExpector<TIn1, TIn2, TIn3, TIn4, TIn5, StringTestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5>>(this, CreateTestCase(in1, in2, in3, in4, in5));
        }        
    }    

    /// <summary>
    /// Test row collector for string outputs with 6 input arguments
    /// </summary>
    public class StringTestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6> : TestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, string>
    {        
        public StringTestRowCollector(TestCollection<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, string> testCollection)
            : base(testCollection)
        {            
        }

        public StringExpector<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, StringTestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6>> Given(TIn1 in1, TIn2 in2, TIn3 in3, TIn4 in4, TIn5 in5, TIn6 in6)
        {            
            return new StringExpector<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, StringTestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6>>(this, CreateTestCase(in1, in2, in3, in4, in5, in6));
        }        
    }    

}